//package com.lin.wx.pament.component.util;
//
//import com.alibaba.fastjson.JSONObject;
//import com.dxjr.finance.galaxy.common.context.user.UserInfoContextHolder;
//import com.dxjr.finance.galaxy.common.redis.RedisKeyGenerator;
//import com.dxjr.finance.galaxy.core.framework.redis.IRedisComponent;
//import com.dxjr.finance.toolkit.business.dao.entity.AnalyseProductPaymentEntity;
//import com.dxjr.finance.toolkit.business.dao.entity.AnalyseProductPaymentRecordEntity;
//import com.dxjr.finance.toolkit.business.dao.entity.AnalyseProductPaymentRefundsEntity;
//import com.dxjr.finance.toolkit.business.service.context.Env;
//import com.dxjr.finance.toolkit.business.service.payment.RecordService;
//import com.dxjr.finance.toolkit.business.service.payment.component.PaymentService;
//import com.dxjr.finance.toolkit.business.service.payment.component.model.Payment;
//import com.dxjr.finance.toolkit.business.service.payment.component.model.TransactionOrder;
//import com.dxjr.finance.toolkit.business.service.payment.component.model.TransactionResult;
//import com.google.gson.Gson;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.lang3.math.NumberUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Optional;
//import java.util.concurrent.TimeUnit;
//
///**
// * 支付助手
// *
// * @author: linjiang
// * @date: 2024/11/27
// */
//@Slf4j
//@Component
//public class PaymentHelper {
//    @Autowired
//    private Env env;
//    @Autowired
//    private RecordService recordService;
//    @Autowired
//    private IRedisComponent redisComponent;
//    @Autowired
//    private List<PaymentService> paymentServices;
//
//    /**
//     * 支付
//     *
//     * @param payment 支付参数
//     */
//    public JSONObject prepay(AnalyseProductPaymentEntity payment) {
//        String payType = env.getPayType();
//        return this.prepay(payType, payment);
//    }
//
//    /**
//     * 支付
//     *
//     * @param payType 支付产品
//     * @param payment 支付参数
//     * @return
//     */
//    public JSONObject prepay(String payType, AnalyseProductPaymentEntity payment) {
//        PaymentService paymentService = this.getPaymentService(payType);
//        if (paymentService != null) {
//            Payment buildPayment = Payment.builder().userId(payment.getUserId()).build();
//            buildPayment.setPaymentOrder(payment);
//            // 支付调用
//            TransactionResult prepay = paymentService.prepay(buildPayment);
//            return doPaymentResult(prepay);
//        } else {
//            // 模拟支付
//            JSONObject resp = new JSONObject();
//            resp.put("orderNo", payment.getOrderNo());
//            return resp;
//        }
//    }
//
//    /**
//     * 关单
//     *
//     * @param closeOrder
//     */
//    public void close(TransactionOrder closeOrder) {
//        String payType = env.getPayType();
//        this.close(payType, closeOrder);
//    }
//
//    /**
//     * 关单
//     *
//     * @param payType
//     * @param closeOrder
//     */
//    public void close(String payType, TransactionOrder closeOrder) {
//        PaymentService paymentService = this.getPaymentService(payType);
//        if (paymentService != null) {
//            paymentService.close(closeOrder);
//        }
//    }
//
//    /**
//     * 批量异步关单
//     *
//     * @param closeOrderList
//     */
//    @Async
//    public void batchAsyncClose(List<TransactionOrder> closeOrderList) {
//        List<AnalyseProductPaymentRecordEntity> failRecords = new ArrayList<>();
//
//        for (TransactionOrder order : closeOrderList) {
//            String closeOrderKey = RedisKeyGenerator.TOOLKIT.generateKey("order:scheduled:close:locker:") + order.getOutTradeNo();
//            Boolean isOk = redisComponent.setIfAbsent(closeOrderKey, 1, 1, TimeUnit.MINUTES);
//            if (!isOk) {
//                continue;
//            }
//
//            try {
//                // 关单
//                this.close(order);
//            } catch (Exception e) {
//                AnalyseProductPaymentRecordEntity record = new AnalyseProductPaymentRecordEntity();
//                record.setModule("remote-close-order");
//                record.setMessage(e.getMessage());
//                record.setStatus(NumberUtils.INTEGER_TWO);
//                record.setContext(new Gson().toJson(order));
//                failRecords.add(record);
//            }
//        }
//
//        // 日志记录
//        recordService.save(failRecords);
//    }
//
//    /**
//     * 查单
//     *
//     * @param queryOrder
//     */
//    public TransactionResult query(TransactionOrder queryOrder) {
//        String payType = env.getPayType();
//        return this.query(payType, queryOrder);
//    }
//
//    /**
//     * 关单
//     *
//     * @param payType
//     * @param closeOrder
//     */
//    public TransactionResult query(String payType, TransactionOrder closeOrder) {
//        PaymentService paymentService = this.getPaymentService(payType);
//        if (paymentService != null) {
//            return paymentService.query(closeOrder);
//        }
//        return new TransactionResult();
//    }
//
//    /**
//     * 退单
//     *
//     * @param refunds
//     */
//    public String refunds(AnalyseProductPaymentRefundsEntity refunds) {
//        String payType = env.getPayType();
//        return this.refunds(payType, refunds);
//    }
//
//    /**
//     * 退单
//     *
//     * @param payType
//     * @param refunds
//     */
//    public String refunds(String payType, AnalyseProductPaymentRefundsEntity refunds) {
//        PaymentService paymentService = this.getPaymentService(payType);
//        if (paymentService != null) {
//            Payment payment = new Payment();
//            payment.setUserId(UserInfoContextHolder.getUserId());
//            payment.setRefundsOrder(refunds);
//            TransactionResult refundsResp = paymentService.refunds(payment);
//            return refundsResp.getTransactionId();
//        }
//        return null;
//    }
//
//
//    /**
//     * 处理支付结果
//     *
//     * @param result
//     * @return
//     */
//    private JSONObject doPaymentResult(TransactionResult result) {
//        JSONObject resp = new JSONObject();
//        // 判断是否是小程序类的支付
//        if (StringUtils.isNotEmpty(result.getPaymentDataPackage())) {
//            resp.put("dataPackage", result.getPaymentDataPackage());
//            cachePaymentParam(result.getOrderNo(), result.getPaymentDataPackage());
//        }
//        return resp;
//    }
//
//    /**
//     * 获取支付服务
//     *
//     * @param payType 支付产品，如（微信的jspai支付）
//     * @return
//     */
//    private PaymentService getPaymentService(String payType) {
//        Optional<PaymentService> first = paymentServices.stream().filter(service -> service.support(payType)).findFirst();
//        if (first.isPresent()) {
//            return first.get();
//        }
//        log.error("系统未开发任何支付相关接口！");
//        return null;
//    }
//
//    /**
//     * 缓存支付参数
//     *
//     * @param orderNo
//     * @param paymentParam
//     */
//    private void cachePaymentParam(String orderNo, String paymentParam) {
//        String prepayIdKey = RedisKeyGenerator.TOOLKIT.generateKey("pay:prepayId:") + orderNo;
//        redisComponent.set(prepayIdKey, paymentParam, 1, TimeUnit.HOURS);
//    }
//}
